Eloquent ORM 是 Laravel 提供的一個 ORM (對象關聯映射)工具,用於與資料庫進行交互。
它提供了一個簡單且直觀的 API 來進行資料的 CRUD (創建、讀取、更新和刪除)操作。
💡 Eloquent: 使用模型進行資料的 CRUD 操作
創建(Create)
use App\Models\Flight;
// 創建並儲存一筆新資料
$flight = new Flight();
$flight->name = 'Flight 101';
$flight->airline = 'Airline Example';
$flight->save();
// 或者使用批量賦值
Flight::create([
'name' => 'Flight 102',
'airline' => 'Airline Sample'
]);
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model
{
// 允許批量賦值的欄位
protected $fillable = ['name', 'airline'];
}
讀取(Read)
use App\Models\Flight;
// 取得所有紀錄
$flights = Flight::all();
// 取得單筆紀錄
$flight = Flight::find(1);
// 取得符合條件的紀錄
$flights = Flight::where('airline', 'Airline Example')->get();
更新(Update)
use App\Models\Flight;
// 查找並更新紀錄
$flight = Flight::find(1);
$flight->name = 'Updated Flight Name';
$flight->save();
// 或者使用更新方法
Flight::where('id', 1)->update(['name' => 'Updated Flight Name']);
刪除(Delete)
use App\Models\Flight;
// 查找並刪除紀錄
$flight = Flight::find(1);
$flight->delete();
// 使用條件刪除
Flight::where('airline', 'Airline Example')->delete();
查詢建構器(Query Builder)是一種用於構造和執行資料庫查詢的工具,它提供了一個流暢且直觀的 API 來創建 SQL 查詢,而不需要直接撰寫原始 SQL 語句。
Laravel 的查詢建構器可以與各種資料庫系統(如 MySQL
、PostgreSQL
、SQLite
等)配合使用,並且支持豐富的查詢功能,包括選擇、過濾、排序和聯接等。
觀察 SQL 指令的方法
file path:app/Providers/AppServiceProvider.php
code:DB::listen(function (QueryExecuted $q) { dump($q->sql); });
貼上畫面顯示的 SQL 語法觀察查詢的結果,貼上語法的路徑:/Library/Application Support/JetBrains/PhpStorm2023.3/consoles/db/f6517b4a-9d68-4875-8266-99d8ff85328c/console.sql
主要功能:
DB::table('flights')
->where('status', 'active')
->get();
DB::table('flights')
->where('status', 'active')
->orderBy('departure_time')
->get();
💡 查詢構建器: 使用 DB 類來進行更靈活的 SQL 查詢
基本查詢
use Illuminate\Support\Facades\DB;
// 取得所有紀錄
$flights = DB::table('flights')->get();
// 取得單筆紀錄
$flight = DB::table('flights')->where('id', 1)->first();
// 取得符合條件的紀錄
$flights = DB::table('flights')->where('airline', 'Airline Example')->get();
插入資料
DB::table('flights')->insert([
'name' => 'Flight 103',
'airline' => 'New Airline'
]);
更新資料
DB::table('flights')
->where('id', 1)
->update(['name' => 'Updated Flight Name']);
刪除資料
DB::table('flights')
->where('id', 1)
->delete();
數據庫種子允許在開發過程中填充資料表以進行測試或預設資料,通常會創建一個 Seeder 類來定義如何填充資料
💡 數據庫種子: 使用 Seeder 類來填充測試或預設資料
以下是從創建開始到執行的相關流程:
step 1 - 創建 Seeder 類
下指令 php artisan make:seeder FlightsTableSeeder
創建,FlightsTableSeeder
這是檔案名稱。
step 2 - 編輯 Seeder 類
在 database/seeders/FlightsTableSeeder.php
文件中建立資料:
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use App\Models\Flight;
class FlightsTableSeeder extends Seeder
{
public function run()
{
// 插入多筆資料
Flight::create([
'name' => 'Flight 104',
'airline' => 'Seeded Airline'
]);
Flight::create([
'name' => 'Flight 105',
'airline' => 'Another Seeded Airline'
]);
}
}
step 3 - 執行 Seeder
下指令 php artisan db:seed --class=FlightsTableSeeder
執行
step 4 - 執行所有 Seeders
在 database/seeders/DatabaseSeeder.php
建立函數:
public function run()
{
$this->call(FlightsTableSeeder::class);
}
然後下指令 php artisan db:seed
執行
請嘗試用 seeder 的方法間把以下測試資料加進去 users 表格中
測試資料:
[
'name' => 'monica',
'email' => 'aa@asd.com',
'password' => Hash::make('123')
],
[
'name' => 'kuku',
'email' => 'bb@asd.com',
'password' => Hash::make('123')
]
step 1 - 創建 Seeder 類
指令 php artisan make:seeder UsersTableSeeder
step 2 - 編輯 Seeder 類
打開建立的 UsersTableSeeder
step 3 - 註冊 Seeder 類
回到 database/seeders/DatabaseSeeder.php
,註冊 UsersTableSeeder
run
會在執行db:seed
這個 Artisan command 時被調用call
方法來運行其他的 seed 類
<?php
namespace Database\Seeders;
// use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
// 註冊 Seeder
class DatabaseSeeder extends Seeder
{
/**
* Seed the application's database.
*/
public function run(): void
{
$this->call([UsersTableSeeder::class]);
// \App\Models\User::factory(10)->create();
// \App\Models\User::factory()->create([
// 'name' => 'Test User',
// 'email' => 'test@example.com',
// ]);
}
}
step 4 - 執行 Seeder
指令 php artisan db:seed
step 5 - 彩蛋(使用模型工廠)
public function run(): void
{
User::factory()->times(20)->create();
}
public function run(): void
{
// 查找記錄,如果找到記錄,則更新該記錄;如果未找到記錄,則創建一個新記錄
User::query()->updateOrCreate(
['email' => 'girl@example.com'], // 查找條件
[
'name' => 'girl',
'password' => Hash::make('123')
] // 變更內容
);
// 查找記錄,如果找到記錄,則返回該記錄;如果未找到記錄,則創建一個新記錄並返回
User::query()->firstOrCreate(
['email' => 'boy@example.com'], // 查找條件
[
'name' => 'boy',
'password' => Hash::make('123'),
] // 變更內容
);
}
延續第 5 天:數據模型與遷移知道模型之間有所謂的關聯,也知道資料庫可以用 CRUD,但是如果一次編輯多筆可以用createMany()、Upserts,但是因為多筆很難保證每次都可以新增成功,這時候可以用 DB::transaction
功能確保這兩件事情都會執行或是都不執行,如果有任何一項操作執行失敗,資料庫就會回滾至執行前的資料狀態。
文件:Database Transactions
參考文章:簡單介紹 Laravel 的 DB Transactions & Database Transaction & ACID
運氣超好,系統當機連發 7 次,真的超幸運
延續第 5 天:數據模型與遷移知道模型之間有所謂的關聯,也知道資料庫可以用 CRUD,但是如果一次編輯多筆可以用createMany()、Upserts,但是因為多筆很難保證每次都可以新增成功,這時候可以用 DB::transaction
功能確保這兩件事情都會執行或是都不執行,如果有任何一項操作執行失敗,資料庫就會回滾至執行前的資料狀態。
文件:Database Transactions
參考文章:簡單介紹 Laravel 的 DB Transactions & Database Transaction & ACID
運氣超好,系統當機連發 7 次,真的超幸運
延續第 5 天:數據模型與遷移知道模型之間有所謂的關聯,也知道資料庫可以用 CRUD,但是如果一次編輯多筆可以用createMany()、Upserts,但是因為多筆很難保證每次都可以新增成功,這時候可以用 DB::transaction
功能確保這兩件事情都會執行或是都不執行,如果有任何一項操作執行失敗,資料庫就會回滾至執行前的資料狀態。
文件:Database Transactions
參考文章:簡單介紹 Laravel 的 DB Transactions & Database Transaction & ACID
運氣超好,系統當機連發 7 次,真的超幸運
延續第 5 天:數據模型與遷移知道模型之間有所謂的關聯,也知道資料庫可以用 CRUD,但是如果一次編輯多筆可以用createMany()、Upserts,但是因為多筆很難保證每次都可以新增成功,這時候可以用 DB::transaction
功能確保這兩件事情都會執行或是都不執行,如果有任何一項操作執行失敗,資料庫就會回滾至執行前的資料狀態。
文件:Database Transactions
參考文章:簡單介紹 Laravel 的 DB Transactions & Database Transaction & ACID
運氣超好,系統當機連發 7 次,真的超幸運
延續第 5 天:數據模型與遷移知道模型之間有所謂的關聯,也知道資料庫可以用 CRUD,但是如果一次編輯多筆可以用createMany()、Upserts,但是因為多筆很難保證每次都可以新增成功,這時候可以用 DB::transaction
功能確保這兩件事情都會執行或是都不執行,如果有任何一項操作執行失敗,資料庫就會回滾至執行前的資料狀態。
文件:Database Transactions
參考文章:簡單介紹 Laravel 的 DB Transactions & Database Transaction & ACID
運氣超好,系統當機連發 7 次,真的超幸運
延續第 5 天:數據模型與遷移知道模型之間有所謂的關聯,也知道資料庫可以用 CRUD,但是如果一次編輯多筆可以用createMany()、Upserts,但是因為多筆很難保證每次都可以新增成功,這時候可以用 DB::transaction
功能確保這兩件事情都會執行或是都不執行,如果有任何一項操作執行失敗,資料庫就會回滾至執行前的資料狀態。
文件:Database Transactions
參考文章:簡單介紹 Laravel 的 DB Transactions & Database Transaction & ACID
運氣超好,系統當機連發 7 次,真的超幸運
延續第 5 天:數據模型與遷移知道模型之間有所謂的關聯,也知道資料庫可以用 CRUD,但是如果一次編輯多筆可以用createMany()、Upserts,但是因為多筆很難保證每次都可以新增成功,這時候可以用 DB::transaction
功能確保這兩件事情都會執行或是都不執行,如果有任何一項操作執行失敗,資料庫就會回滾至執行前的資料狀態。
文件:Database Transactions
參考文章:簡單介紹 Laravel 的 DB Transactions & Database Transaction & ACID
運氣超好,系統當機連發 7 次,真的超幸運